package docker

import (
	"fmt"
	. "pdocker/tool/docker"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/filters"
	log "github.com/sirupsen/logrus"
)

func ShowImages() []types.ImageSummary {
	images, err := Cli.ImageList(Ctx, types.ImageListOptions{
		All: true,
	})
	if err != nil {
		panic(err)
	}

	for _, image := range images {
		fmt.Printf("%s \n", image.RepoTags)
	}
	return images
}

//
//func Builder(all bool, filters []string, force bool, callback string) []string {
//	if all {
//		folders, err := ioutil.ReadDir(config.Config.Docker.CTFDir)
//		if err != nil {
//			return []string{err.Error()}
//		} else {
//			var folderList []string
//			for _, folder := range folders {
//				folderList = append(folderList, folder.Name())
//			}
//			go func() {
//				for _, folder := range folderList {
//					_, _ = BuildImage(folder, force, callback)
//					Log.Printf("%s finish", folder)
//				}
//			}()
//			return folderList
//		}
//	} else {
//
//		for _, filter := range filters {
//			go func() {
//				_, _ = BuildImage(filter, force, callback)
//				Log.Printf("%s finish", filter)
//			}()
//		}
//		return filters
//	}
//}
//
//func BuildImage(image string, force bool, callback string) (types.ImageBuildResponse, error) {
//	resp, _ := GetImage(image)
//	if resp && !force {
//		return types.ImageBuildResponse{
//			Body:   nil,
//			OSType: fmt.Sprintf("Image %s already built", image),
//		}, nil
//	} else {
//		// download Dockerfile build config
//
//		doneCh := make(chan struct{})
//		prefix := fmt.Sprintf("file/ctf/%s/docker/", image)
//		// Indicate to our routine to exit cleanly upon return.
//		defer close(doneCh)
//		objectCh := MinioClient.ListObjects("data", prefix, true, doneCh)
//		for object := range objectCh {
//			if object.Err != nil {
//				Log.Println(object.Err)
//			}
//			index := strings.Index(object.Key, prefix)
//			err := MinioClient.FGetObject("data", object.Key,
//				fmt.Sprintf("%s/%s", image, object.Key[index+len(prefix):]), minio.GetObjectOptions{})
//			if err != nil {
//				Log.Println(err)
//			}
//
//		}
//
//		var buffer bytes.Buffer
//		tar := new(archivex.TarFile)
//		Log.Println("image dir:", image)
//		_ = tar.CreateWriter(image, &buffer)
//		_ = tar.AddAll(image, false)
//		_ = tar.Close()
//		buildContext := &buffer
//		//ioutil.WriteFile(`/home/ares/test.tar`, buffer.Bytes(), 0644)
//		opt := types.ImageBuildOptions{
//			Context:     buildContext,
//			Tags:        []string{image},
//			Remove:      true,
//			ForceRemove: true,
//			PullParent:  true,
//			//Dockerfile: "Dockerfile",
//		}
//		response, err := Cli.ImageBuild(Ctx, buildContext, opt)
//		Log.Println(response)
//		// remove file
//		os.RemoveAll(image)
//
//		var code string
//		if err == nil {
//			code = "200"
//		} else if strings.Index(err.Error(), "empty") == -1 {
//			code = "401"
//		} else {
//			code = "404"
//		}
//		if callback != "" {
//			resp, _ := http.Get(
//				fmt.Sprintf("%s?name=%s&code=%s", callback, image, code))
//			defer resp.Body.Close()
//			body, err := ioutil.ReadAll(resp.Body)
//			if err != nil {
//			}
//			Log.Printf("Get: %s Return: %s \n", callback, string(body))
//		}
//		if err != nil {
//			Log.Println(err)
//			return types.ImageBuildResponse{}, err
//		}
//		defer response.Body.Close()
//		Log.Println(response.OSType)
//		var output bytes.Buffer
//		termFd, isTerm := term.GetFdInfo(&output)
//		_ = jsonmessage.DisplayJSONMessagesStream(response.Body, &output, termFd, isTerm, nil)
//		config.BuildInformation[image] = string(output.Bytes())
//		Log.Println(config.BuildInformation[image])
//		return response, err
//	}
//}

func LabBuilder(lab string, filters []string) {

}

func GetImage(image string) (bool, error) {
	i, err := Cli.ImageList(Ctx, types.ImageListOptions{
		All:     true,
		Filters: filters.NewArgs(filters.Arg("reference", image)),
	})
	if err != nil {
		log.Printf("Error: %s", err)
		return false, err
	} else if len(i) == 0 {
		return false, fmt.Errorf("镜像 %s 未找到", image)
	} else {
		log.Printf("%s 已存在", image)
	}
	return true, nil
}
